/**
 * Created by Myron on 2016/2/15.
 * 这里制作一个公用的微信类库
 */
Q = require('q');
var url = require('url');
var request = require('request');
var async = require('async');
var BufferHelp = require('bufferhelper');
var iconv = require('iconv-lite');
var fs = require('fs');

var wxcache = {
    token: null,
    time: 0
};

//先加载缓存文件中的内容到chace中
function loadChace(config, cb) {
    // 判断内存中是否有缓存


    console.log('=========判断内存中是否有缓存=======');
    if (!wxcache || !wxcache.token) {
        console.log('readCache');
        //如果没有值读取文件加载一次
        readFile(config.cache_json_file + '/wxcache.json', function(str) {
            if (str) {
                console.log('readCache ok');
                wxcache = JSON.parse(str);
               // console.log(wxcache);
            }
            tryGetToken(config, cb);
        });
    }
    else {
        tryGetToken(config, cb);
    }
}


//获取普通的accessToken
function getToken(config, cb) {
    var tokenUrl = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appId=' + config.appId + '&secret=' + config.appSecret;
    console.log(tokenUrl);
    request.get(tokenUrl, function(error, response, body) {
        if (error) {
            //console.log('GET查询报错1');
            cb('getToken error', error);
        }
        else {
            try {
                //console.log('GET查询报错0');
                var token = JSON.parse(body).access_token;
                //console.log(token);
                cb(null, token);
            }
            catch (e) {
                //console.log('GET查询报错2');
                cb('getToken error', e);
            }
        }
    });
}


//尝试获取TOKEN
function tryGetToken(config,cb){
     console.log('=========尝试获取TOKEN=======');
    if (!wxcache.token || (new Date().getTime() - wxcache.time) > 7000000) {
        // wxcache过期需要重新获取一次
        wxcache.time = wxcache.time + 10 * 1000;  // 缓解高并发多次获取
        async.waterfall([function(cb) {
            getToken(config, cb);
        }], function(error, token) {
            if (error) {
                cb('getToken  error', error);
            }
            else {
                wxcache.token = token;
                wxcache.time = new Date().getTime();
                // 文件保存
                writeFile(config.cache_json_file + '/wxcache.json', JSON.stringify(wxcache));
                console.log(result);
                cb(null, wxcache);
            }
        });
    }else{
        cb(null,wxcache);
    }
}

function readFile(path, cb) {
    var readstream = fs.createReadStream(path);
    var bf = new BufferHelp();
    readstream.on('data', function(chunk) {
        bf.concat(chunk);
    });
    readstream.on('end', function() {
        cb && cb(decodeBuffer(bf));
    });
}

function writeFile(path, str, cb) {
    var writestream = fs.createWriteStream(path);

    writestream.write(str);
    writestream.on('close', function() {
        cb && cb();
    });
}

function decodeBuffer(bf, encoding) {
    var val = iconv.decode(bf.toBuffer(), encoding || 'utf8');
    if (val.indexOf('�') != -1) {
        val = iconv.decode(bf.toBuffer(), 'gbk');
    }
    return val;
}



//-----------获取关注用户基本信息（包括UnionID机制）------------
function getUserInfo(access_token,openid,config,cb){
    var userinfoUrl = 'https://api.weixin.qq.com/cgi-bin/user/info?access_token='+access_token+'&openid='+openid+'&lang=zh_CN';
    console.log(userinfoUrl);
   // console.log(openid);
    request.get(userinfoUrl, function(error, response, body) {
        if (error) {
            cb('getUserinfoUrl error', error);
        }
        else {
            try {
                var Userinfo = JSON.parse(body);
                //console.log(Userinfo); //有时候USERINFO会得不到 因为在有效期内token可能损坏
                if(Userinfo.errcode===40001){ //如果发现Token无效 需要重新获取一次token
                    console.log('如果发现Token无效 需要重新获取一次token');
                    async.waterfall([
                        function(cb) {
                            getToken(config, cb); //返回token
                        },function(token,cb) {
                           // console.log("获得了新的token"+token);
                            wxcache.token = token;
                            wxcache.time = new Date().getTime();
                            // 文件保存
                            writeFile(config.cache_json_file + '/wxcache.json', JSON.stringify(wxcache));
                            cb(null, token);
                        },
                    ], function (err, token) {
                        console.log(err);
                        getUserInfo(token,openid,config,cb);
                    });

                }else{
                    cb(null, Userinfo);
                }
            }
            catch (e) {
                cb('getToken error', e);
            }
        }
    });
}



module.exports = {
    //获取微信普通access_token
    getToken:function(config){
        //var promise = new AV.Promise();
        var deferred = Q.defer();
        async.waterfall([
            function(callback){
                loadChace(config,callback); //把缓存文件中的内容加载到 wxchace中
            },
        ], function (err, result) {
            if(err){
                deferred.reject(err);
            }else{
                deferred.resolve(result.token);
            }
        });
        return deferred.promise;
    },
    //获取关注用户基本信息（包括UnionID机制）
    getUserInfo:function(config,OpenID){
        //var promise = new AV.Promise();

        var deferred = Q.defer();
        async.waterfall([
            function(callback){
                cache_json_file = config.cache_json_file + '/wxcache.json';
                fs.exists(cache_json_file, function (exists) {
                    if(exists === false){
                        fs.writeFile(cache_json_file, '{"token":"sM4AOVdWfPE4DxkXGEs8VIfqZ_qvqVQK7OG-H7wMxEbFv8EdbdCrIp_KYozTh9Fq0dGfQBdVBHYwluHdjC3ZNg","time":1455503704060}', function (err) {
                            if (err) throw err;
                            console.log('cache_json_file is created!');
                            callback(null);
                        });
                    }else{
                        console.log('cache_json_file is exist!');
                            callback(null);
                    }
                });

            },
            function(callback){
                loadChace(config,callback); //获取TOKEN
            },
            function(result,callback){
                getUserInfo(result.token,OpenID,config,callback); //把缓存文件中的内容加载到 wxchace中
            },
        ], function (err, userinfo) {
            if(err){
                deferred.reject(err);
            }else{
                deferred.resolve(userinfo); //返回查询结果UserInfo
            }
        });
        return deferred.promise;
    }
}